package org.gm.mybatis.ext.mapper;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.ResultType;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;
import org.gm.mybatis.ext.sql.SqlQuery;
import org.gm.mybatis.ext.sql.SqlQueryProvider;
import org.gm.mybatis.ext.sql.SqlQueryUpdate;

public interface BaseMapper<T, E> {
	
	/**
	 * 自由查询记录条数统计
	 * @param sqlQuery
	 * @return
	 */
	@SelectProvider(type = SqlQueryProvider.class, method = "countDynamicSql")
    @ResultType(Integer.class)
    int countBySqlQuery(SqlQuery sqlQuery);
	
	/**
	 * 根据主键查询关系对象
	 * @param id
	 * @return
	 */
	T selectRelationByPrimaryKey(Serializable id);
	
	/**
	 * 根据条件值查询关系对象
	 * @param example
	 * @return
	 */
	List<T> selectRelationByExample(E example);
	
	@SelectProvider(type = SqlQueryProvider.class, method = "dynamicSql")
    @ResultType(Map.class)
    List<Map<String, Object>> selectBySqlQuery(SqlQuery sqlQuery);
	
	/**
	 * 自由更新数据库数据
	 * @param params
	 * @return
	 */
	@UpdateProvider(type = SqlQueryUpdate.class, method = "dynamicSql")
    int updatebySqlQuery(SqlQuery params);
	
	/**
	 * 自定义更新数据
	 * @param record
	 * @param example
	 * @return
	 */
	int updateFromMapByExample(@Param("record") Map<String, ?> record, @Param("example") E example);
	
	/********generator 默认创建的操作函数**********/
	int countByExample(E example);

    int deleteByExample(E example);

    int deleteByPrimaryKey(Serializable id);

    int insert(T record);

    int insertSelective(T record);

    List<T> selectByExample(E example);

    T selectByPrimaryKey(Serializable id);

    int updateByExampleSelective(@Param("record") T record, @Param("example") E example);

    int updateByExample(@Param("record") T record, @Param("example") E example);

    int updateByPrimaryKeySelective(T record);

    int updateByPrimaryKey(T record);
}
